package view;

import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.util.List;
import java.util.Map;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

import common.Contexto;
import controller.MainController;
import model.Producto;

@SuppressWarnings("serial")
public class FacturaPanel extends JPanel {

	private JButton guardarB, volverB;
	private JLabel productosL;
	private JScrollPane productosSP;
	private JTable productosT;
	private ProductosTableModel tableModel;
	
	public FacturaPanel(List<Producto> productos) {
		this.tableModel = new ProductosTableModel(productos,this);
		initGui();
		layoutComponents();
		initActions();
	}

	private void initGui() {
		productosL = new JLabel("Productos:");

		volverB = new JButton("Volver");
		guardarB = new JButton("Guardar");

		productosT = new JTable(tableModel);
		productosT.setPreferredScrollableViewportSize(new Dimension(300,200));
		productosSP = new JScrollPane(productosT);
	}

	

	private void layoutComponents() {
		this.setLayout(new GridBagLayout());

		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 0;
		c.gridy = 0;
		c.anchor = GridBagConstraints.WEST;
		c.fill = GridBagConstraints.BOTH;
		c.insets = new Insets(0, 2, 2, 4);
		add(productosL, c);

		c.gridx = 0;
		c.gridy = 1;
		c.gridwidth = 5;
		c.ipadx = 120;
		c.ipady = 100;
		add(productosSP, c);
		
		c.gridx = 0;
		c.gridy = 2;
		c.gridwidth = 1;
		c.gridheight = 1;
		c.ipady = 0;
		c.insets = new Insets(20, 0, 20, 0);

		
		add(guardarB, c);
		c.gridx = 2;
		add(volverB, c);

	}

	private void initActions() {
		guardarB.setAction(new AbstractAction("Guardar") {
			@Override
			public void actionPerformed(ActionEvent e) {
				boolean guardado = guardarFactura();
				SwingUtilities.windowForComponent(FacturaPanel.this).dispose();
				if(guardado) {
					notificarMensaje("La factura fue creada con exito");
				} else {
					notificarError("Ocurrio un error, no pudo crearse la factura");
				}
			}
		});

		volverB.setAction(new AbstractAction("Volver") {
			@Override
			public void actionPerformed(ActionEvent e) {
				SwingUtilities.windowForComponent(FacturaPanel.this).dispose();
			}
		});
		
	}
	
	private boolean guardarFactura() {
		boolean result = false;
		Map<Producto,Integer> productos = tableModel.getProductosSeleccionados();

		result = MainController.getInstance().altaFactura(productos);
		
		return result;
	}
	
	public void showPanel() {
		final JFrame mainFrame = new JFrame();
		mainFrame.setTitle("Nueva Factura");
		mainFrame.getContentPane().add(this);
		mainFrame.setPreferredSize(new Dimension(600, 450));
		mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		mainFrame.pack();
		mainFrame.setLocationRelativeTo(null);
		mainFrame.setVisible(true);
	}
	
	private void notificarMensaje(String mensaje) {
		Contexto.displayFeedbackMessage(FacturaPanel.this, mensaje);
	}
	
	private void notificarError(String error) {
		Contexto.displayErrorMessage(FacturaPanel.this,error);
	}
	
	public void actualizarProductos(List<Producto> productos) {
		tableModel.setProductos(productos);
	}

}